package com.bom_samaritano.controller;

import java.util.Collection;

import android.content.Context;

import com.bom_samaritano.Exception.BusinessException;
import com.bom_samaritano.model.Person;
import com.bom_samaritano.model.Route;
import com.bom_samaritano.model.VOGeneric;
import com.bom_samaritano.repositorio.IRepositorioUsuario;
import com.bom_samaritano.repositorio.RepositorioUsuarioSQlite;
import com.bom_samaritano.repositorio.RepositorioUsuarioWS;
import com.bom_samaritano.temp.LatLng;
import com.bom_samaritano.util.Util;

public class Controller {

	private static Controller instance;
	private static IRepositorioUsuario repositorioUsuario;
	private static Context context;

	private Controller(Context context) {
		Controller.context = context;
		if (Util.hasInternetConnection(context)) {
			repositorioUsuario = RepositorioUsuarioWS.getInstance();
		} else {
			repositorioUsuario = RepositorioUsuarioSQlite.getInstance(context);
		}
	}

	public static Controller getInstance(Context context) {

		if (instance == null) {
			instance = new Controller(context);
		}

		return instance;
	}

	public void atualizarUsuario(Person usuario) throws BusinessException {
		try {
			repositorioUsuario.atualizarUsuario(usuario);

		} catch (BusinessException e) {
			// tenta salvar localmente
			if (repositorioUsuario instanceof RepositorioUsuarioWS) {
				repositorioUsuario = RepositorioUsuarioSQlite
						.getInstance(context);
				repositorioUsuario.atualizarUsuario(usuario);
				throw new BusinessException(
						"Nao foi possivel salvar no WS. Salvo Localmente");
			}
			throw new BusinessException();
		}
	}

	public void cadastrarUsuario(Person usuario) throws BusinessException {
		try {
			repositorioUsuario.cadastrarUsuario(usuario);
		} catch (BusinessException e) {
			// tenta salvar localmente
			if (repositorioUsuario instanceof RepositorioUsuarioWS) {
				repositorioUsuario = RepositorioUsuarioSQlite
						.getInstance(context);
				repositorioUsuario.cadastrarUsuario(usuario);
				throw new BusinessException(
						"Nao foi possivel salvar no WS. Salvo Localmente");
			}
			throw new BusinessException();
		}
	}

	public void deletarUsuario(Person usuario) throws BusinessException {
		try {
			repositorioUsuario.deletarUsuario(usuario);

		} catch (BusinessException e) {
			// tenta salvar localmente
			if (repositorioUsuario instanceof RepositorioUsuarioWS) {
				repositorioUsuario = RepositorioUsuarioSQlite
						.getInstance(context);
				repositorioUsuario.deletarUsuario(usuario);
				throw new BusinessException(
						"Nao foi possivel salvar no WS. Salvo Localmente");
			}
			throw new BusinessException();
		}
	}

	public void cadastrarRota(Route route) throws BusinessException {
		try {
			repositorioUsuario.cadastrarRota(route);
		} catch (BusinessException e) {
			// tenta salvar localmente
			if (repositorioUsuario instanceof RepositorioUsuarioWS) {
				repositorioUsuario = RepositorioUsuarioSQlite
						.getInstance(context);
				repositorioUsuario.cadastrarRota(route);
				throw new BusinessException(
						"Nao foi possivel salvar no WS. Salvo Localmente");
			}
			throw new BusinessException();
		}
	}

	public Collection<VOGeneric> getDataRoute(LatLng start, LatLng end)
			throws BusinessException {
		return repositorioUsuario.getDadosRota(start, end);
	}

	public Person getPerson(String login) {
		Person p;
		try {
			p = repositorioUsuario.getPerson(login);

			if (p == null && repositorioUsuario instanceof RepositorioUsuarioWS) {
				p = RepositorioUsuarioSQlite.getInstance(context).getPerson(
						login);
			}

		} catch (Exception e) {
			p = null;
		}

		return p;

	}

	public void changeRepository(Context context) {
		if (repositorioUsuario instanceof RepositorioUsuarioSQlite)
			repositorioUsuario = RepositorioUsuarioWS.getInstance();
		else
			repositorioUsuario = RepositorioUsuarioSQlite.getInstance(context);

	}

}
